package com.thrd.taiexhibition.utils;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;
import android.util.LruCache;

import com.thrd.basicframework.http.OkHttpUtils;
import com.thrd.basicframework.http.callback.BitmapCallback;
import com.thrd.taiexhibition.BaseApplication;

import java.io.File;
import java.io.FileOutputStream;

import okhttp3.Call;

/**
 * @author: ${唐杰}
 * @date: 2021/4/16
 */
public class ImageCachceUitl {
    public static final int SUCCSEE = 0;
    public static final int FAIL = 1;

    private LruCache<String, Bitmap> cache;//lru算法集合，string是图片的url，bitmap为图片的值类型
    private File cacheDir;


    private ImageCachceUitl(){
        cacheDir= BaseApplication.mContext.getCacheDir();//获得cache文件夹
        int maxSize=(int) (Runtime.getRuntime().maxMemory()/8);//获得运行环境的内存大小的1/8
        cache=new LruCache<String, Bitmap>(maxSize){
            // TODO 每存储一张图片的大小（作用于内存溢出丢图片）
            @Override
            protected int sizeOf(String key, Bitmap value) {
                //返回当前一行所占的字节数*高度，就是图片的大小
                return value.getRowBytes()*value.getHeight();
            }
        };//当前图片缓存总数的大小
    }


    //创建 SingleObject 的一个对象
    private static ImageCachceUitl instance = new ImageCachceUitl();



    //获取唯一可用的对象
    public static ImageCachceUitl getInstance(){
        return instance;
    }


    /**
     * 图片写入cache文件夹下面的操作
     * @param imageUrl
     * @param bitmap
     */
    private void writeToLoce(String imageUrl, Bitmap bitmap) {
        try {
            // String bitmapefilename=MD5Encoder.encode(imageUrl).substring(10);
            Log.i("bitmapefilename", imageUrl);
            File file=new File(cacheDir, imageUrl);
            FileOutputStream fileOutputStream =new FileOutputStream(file);
            //写入文件的操作(1图片类型2图片质量当为100时表示不压缩3文件流)
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    /**
     * 读取文件中图片的操作
     * @param url 图片的连接地址
     * @return
     */
    public void getBitmapFromFile(String url,OnBitmapCallback onBitmapCallback) {
        try {
            if(cache.get(url)!=null){
                onBitmapCallback.onBitmapCallback(cache.get(url));
            }
            //使用Md5工具加密截取前10个字符串
            //   String bitmapefilename=MD5Encoder.encode(url).substring(10);
            /**
             * 在cache文件夹下面找到指定文件
             * dir cache文件存储路径
             * name 文件名称
             */
            File file=new File(cacheDir, url);
            if(file.exists()){
                //  file.mkdir();
                //FileInputStream fileInputStream=new FileInputStream(file);
                Bitmap bitmap= BitmapFactory.decodeFile(file.getPath());//完整文件路径
                onBitmapCallback.onBitmapCallback(bitmap);
                //Log.i("文件路径", file.getPath().toString());
                //2读取之后放入内存,提高效率
                cache.put(url, bitmap);
            }else{
                getBitmapUrl(url,onBitmapCallback);
            }


        } catch (Exception e) {
            e.printStackTrace();
        }


    }


    private void getBitmapUrl(String path,OnBitmapCallback onBitmapCallback){
        OkHttpUtils.get().url(path).build().execute(new BitmapCallback() {
            @Override
            public void onError(Call call, Exception e, int id) {
                if(onBitmapCallback!=null){
                    onBitmapCallback.onBitmapError(e!=null?e.getMessage():"下载失败");
                }
            }

            @Override
            public void onResponse(Bitmap response, int id) {
                if(onBitmapCallback!=null){
                    onBitmapCallback.onBitmapCallback(response);
                }
                writeToLoce(path,response);
            }

            @Override
            public Bitmap onJson(String json) throws Exception {
                return null;
            }
        });

    }




    public   interface  OnBitmapCallback{
        void onBitmapCallback(Bitmap response);
        void onBitmapError(String e);
    }

}
